package com.cw.lang.common.framework.utils;


import com.cw.base.common.model.constants.RestConstant;
import com.cw.base.common.model.constants.RpcConstant;
import com.cw.base.common.model.dto.base.BaseReqDto;
import com.cw.base.common.model.dto.base.BaseUserReqDto;
import com.cw.lang.common.utils.context.ThreadContextStoreUtil;

/**
 * @author chenw
 * @version $$Id: RpcAppParamUtil.java, v 0.1 2018/12/27 9:23 AM chenw Exp $$
 */
public class RpcAppParamUtil {

    private RpcAppParamUtil() {
    }

    /**
     * 获取RPC传递时的{@link BaseReqDto}
     *
     * @return RPC传递时的 {@link BaseReqDto}
     */
    public static BaseReqDto getRpcBaseRequest() {
        return (BaseReqDto) ThreadContextStoreUtil.getInstance()
            .get(RestConstant.RPC_BASE_REQUEST);
    }

    /**
     * 设置RPC传递时的{@link BaseReqDto}
     *
     * @param baseReqDto RPC传递时的 {@link BaseReqDto}
     */
    public static void setRpcBaseRequest(BaseReqDto baseReqDto) {
        if (baseReqDto == null) {
            return;
        }
        ThreadContextStoreUtil.getInstance()
            .set(RestConstant.RPC_BASE_REQUEST, baseReqDto);
    }

    /**
     * 清理{@link BaseReqDto}
     */
    public static void removeRpcBaseRequest() {
        ThreadContextStoreUtil.getInstance()
            .removeKey(RestConstant.RPC_BASE_REQUEST);
    }

    /**
     * 获取RPC传递时的{@link BaseUserReqDto}
     *
     * @return RPC传递时的 {@link BaseUserReqDto}
     */
    public static BaseUserReqDto getRpcBaseUserRequest() {
        return (BaseUserReqDto) ThreadContextStoreUtil.getInstance()
            .get(RestConstant.RPC_BASE_USER_REQUEST);
    }

    /**
     * 设置RPC传递时的{@link BaseUserReqDto}
     *
     * @param baseUserReqDto RPC传递时的 {@link BaseUserReqDto}
     */
    public static void setRpcBaseUserRequest(BaseUserReqDto baseUserReqDto) {
        if (baseUserReqDto == null) {
            return;
        }
        ThreadContextStoreUtil.getInstance()
            .set(RestConstant.RPC_BASE_USER_REQUEST, baseUserReqDto);
    }

    /**
     * 清理{@link BaseUserReqDto}
     */
    public static void removeRpcBaseUserRequest() {
        ThreadContextStoreUtil.getInstance()
            .removeKey(RestConstant.RPC_BASE_USER_REQUEST);
    }

    /**
     * 获取RPC异常时，是抛异常还是组装为{@link CommonResponse}
     *
     * @return true-抛异常，false-组装{@link CommonResponse}
     */
    public static boolean isRpcExceptionThrowEnabled() {
        return (boolean) ThreadContextStoreUtil.getInstance()
            .get(RpcConstant.RPC_EXCEPTION_THROW_ENABLED);
    }

    /**
     * 设置RPC异常时，是抛异常还是组装为{@link CommonResponse}
     *
     * @param rpcExceptionThrowEnabled true-抛异常，false-组装{@link CommonResponse}
     */
    public static void setRpcExceptionThrowEnabled(boolean rpcExceptionThrowEnabled) {
        ThreadContextStoreUtil.getInstance()
            .set(RpcConstant.RPC_EXCEPTION_THROW_ENABLED, rpcExceptionThrowEnabled);
    }

    /**
     * 清理RPC异常时，是抛异常还是组装为{@link CommonResponse}的配置
     */
    public static void removeRpcExceptionThrowEnabled() {
        ThreadContextStoreUtil.getInstance()
            .removeKey(RpcConstant.RPC_EXCEPTION_THROW_ENABLED);
    }
}
